{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "_cell_guid": "b1076dfc-b9ad-4769-8c92-a6c4dae69d19",
    "_uuid": "8f2839f25d086af736a60e9eeb907d3b93b6e0e5"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['monkey_labels.txt', 'validation', 'training']\n"
     ]
    }
   ],
   "source": [
    "# This Python 3 environment comes with many helpful analytics libraries installed\n",
    "# It is defined by the kaggle/python docker image: https://github.com/kaggle/docker-python\n",
    "# For example, here's several helpful packages to load in \n",
    "\n",
    "import numpy as np # linear algebra\n",
    "import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n",
    "\n",
    "# Input data files are available in the \"../input/\" directory.\n",
    "# For example, running this (by clicking run or pressing Shift+Enter) will list the files in the input directory\n",
    "\n",
    "import os\n",
    "print(os.listdir(\"../input\"))\n",
    "\n",
    "# Any results you write to the current directory are saved as output."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "_cell_guid": "79c7e3d0-c299-4dcb-8224-4455121ee9b0",
    "_uuid": "d629ff2d2480ee46fbb7e2d37f6b5fab8052498a"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1.13.1\n",
      "sys.version_info(major=3, minor=6, micro=6, releaselevel='final', serial=0)\n",
      "matplotlib 3.0.3\n",
      "numpy 1.16.3\n",
      "pandas 0.23.4\n",
      "sklearn 0.20.3\n",
      "tensorflow 1.13.1\n",
      "tensorflow._api.v1.keras 2.2.4-tf\n"
     ]
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "import matplotlib as mpl\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import os\n",
    "import pandas as pd\n",
    "import sklearn\n",
    "import sys\n",
    "import tensorflow as tf\n",
    "import time\n",
    "\n",
    "from tensorflow import keras\n",
    "\n",
    "print(tf.__version__)\n",
    "print(sys.version_info)\n",
    "for module in mpl, np, pd, sklearn, tf, keras:\n",
    "    print(module.__name__, module.__version__)\n",
    "    \n",
    "'''\n",
    "调用keras.application.ResNet50模型结构，并实现fine-tuning\n",
    "'''"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "True\n",
      "True\n",
      "True\n",
      "['n3', 'n5', 'n2', 'n4', 'n8', 'n9', 'n6', 'n0', 'n1', 'n7']\n",
      "['n3', 'n5', 'n2', 'n4', 'n8', 'n9', 'n6', 'n0', 'n1', 'n7']\n"
     ]
    }
   ],
   "source": [
    "train_dir = \"../input/training/training\"\n",
    "valid_dir = \"../input/validation/validation\"\n",
    "label_file = \"../input/monkey_labels.txt\"\n",
    "print(os.path.exists(train_dir))\n",
    "print(os.path.exists(valid_dir))\n",
    "print(os.path.exists(label_file))\n",
    "\n",
    "print(os.listdir(train_dir))\n",
    "print(os.listdir(valid_dir))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "   Label        ...          Validation Images\n",
      "0  n0           ...                         26\n",
      "1  n1           ...                         28\n",
      "2  n2           ...                         27\n",
      "3  n3           ...                         30\n",
      "4  n4           ...                         26\n",
      "5  n5           ...                         28\n",
      "6  n6           ...                         26\n",
      "7  n7           ...                         28\n",
      "8  n8           ...                         27\n",
      "9  n9           ...                         26\n",
      "\n",
      "[10 rows x 5 columns]\n"
     ]
    }
   ],
   "source": [
    "labels = pd.read_csv(label_file, header=0)\n",
    "print(labels)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Found 1097 images belonging to 10 classes.\n",
      "Found 272 images belonging to 10 classes.\n",
      "1097 272\n"
     ]
    }
   ],
   "source": [
    "height = 224\n",
    "width = 224\n",
    "channels = 3\n",
    "batch_size = 24\n",
    "num_classes = 10\n",
    "\n",
    "train_datagen = keras.preprocessing.image.ImageDataGenerator(\n",
    "    preprocessing_function = keras.applications.resnet50.preprocess_input,\n",
    "    rotation_range = 40,\n",
    "    width_shift_range = 0.2,\n",
    "    height_shift_range = 0.2,\n",
    "    shear_range = 0.2,\n",
    "    zoom_range = 0.2,\n",
    "    horizontal_flip = True,\n",
    "    fill_mode = 'nearest',\n",
    ")\n",
    "train_generator = train_datagen.flow_from_directory(train_dir,\n",
    "                                                   target_size = (height, width),\n",
    "                                                   batch_size = batch_size,\n",
    "                                                   seed = 7,\n",
    "                                                   shuffle = True,\n",
    "                                                   class_mode = \"categorical\")\n",
    "valid_datagen = keras.preprocessing.image.ImageDataGenerator(\n",
    "    preprocessing_function = keras.applications.resnet50.preprocess_input)\n",
    "valid_generator = valid_datagen.flow_from_directory(valid_dir,\n",
    "                                                    target_size = (height, width),\n",
    "                                                    batch_size = batch_size,\n",
    "                                                    seed = 7,\n",
    "                                                    shuffle = False,\n",
    "                                                    class_mode = \"categorical\")\n",
    "train_num = train_generator.samples\n",
    "valid_num = valid_generator.samples\n",
    "print(train_num, valid_num)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(24, 224, 224, 3) (24, 10)\n",
      "[[0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 1. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 1. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]\n",
      " [1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 1. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]\n",
      " [0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 1. 0. 0. 0.]\n",
      " [0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]\n",
      " [0. 0. 1. 0. 0. 0. 0. 0. 0. 0.]]\n",
      "(24, 224, 224, 3) (24, 10)\n",
      "[[1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 1. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 1. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]\n",
      " [0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 0. 1. 0.]\n",
      " [0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]\n",
      " [0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 1. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]\n",
      " [1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 1. 0. 0. 0.]\n",
      " [0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]\n",
      " [0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]]\n"
     ]
    }
   ],
   "source": [
    "for i in range(2):\n",
    "    x, y = train_generator.next()\n",
    "    print(x.shape, y.shape)\n",
    "    print(y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From /opt/conda/lib/python3.6/site-packages/tensorflow/python/ops/resource_variable_ops.py:435: colocate_with (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Colocations handled automatically by placer.\n",
      "Downloading data from https://github.com/fchollet/deep-learning-models/releases/download/v0.2/resnet50_weights_tf_dim_ordering_tf_kernels_notop.h5\n",
      "94658560/94653016 [==============================] - 3s 0us/step\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "resnet50 (Model)             (None, 2048)              23587712  \n",
      "_________________________________________________________________\n",
      "dense (Dense)                (None, 10)                20490     \n",
      "=================================================================\n",
      "Total params: 23,608,202\n",
      "Trainable params: 20,490\n",
      "Non-trainable params: 23,587,712\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "resnet50_fine_tune = keras.models.Sequential()\n",
    "resnet50_fine_tune.add(\n",
    "    ## 使用别人定义好的 ResNet50模型结构\n",
    "    keras.applications.ResNet50(\n",
    "            ## include_top: 是否包括顶层的全连接层。\n",
    "           include_top = False,\n",
    "            ## 可选，当 include_top 为 False 时，该参数指定了特征提取时的池化方式。\n",
    "            ## 即经过该ResNot50之后的处理方式，因为导数第二层是卷积层，为了将3维数据池化为2维\n",
    "           pooling = 'avg',\n",
    "            ## weights: None 代表随机初始化， 'imagenet' 代表加载在 ImageNet 上预训练的权值。\n",
    "           weights = 'imagenet')\n",
    ")\n",
    "## 最后添加一层全连接层\n",
    "resnet50_fine_tune.add(keras.layers.Dense(num_classes, activation = 'softmax'))\n",
    "\n",
    "## 将 ResNet50参数是否能够训练 设置为 false，即ResNet在模型训练数据中，不需要进行训练了，参数不会再调整\n",
    "resnet50_fine_tune.layers[0].trainable = False\n",
    "\n",
    "## 指定损失函数等数据\n",
    "resnet50_fine_tune.compile(loss=\"categorical_crossentropy\",\n",
    "                           optimizer=\"sgd\", metrics=['accuracy'])\n",
    "resnet50_fine_tune.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/10\n",
      "12/12 [==============================] - 11s 930ms/step - loss: 0.1107 - acc: 0.9853\n",
      "46/46 [==============================] - 49s 1s/step - loss: 0.1138 - acc: 0.9809 - val_loss: 0.1107 - val_acc: 0.9853\n",
      "Epoch 2/10\n",
      "12/12 [==============================] - 11s 944ms/step - loss: 0.0993 - acc: 0.9816\n",
      "46/46 [==============================] - 40s 877ms/step - loss: 0.1232 - acc: 0.9772 - val_loss: 0.0993 - val_acc: 0.9816\n",
      "Epoch 3/10\n",
      "12/12 [==============================] - 11s 943ms/step - loss: 0.1035 - acc: 0.9853\n",
      "46/46 [==============================] - 40s 879ms/step - loss: 0.1087 - acc: 0.9809 - val_loss: 0.1035 - val_acc: 0.9853\n",
      "Epoch 4/10\n",
      "12/12 [==============================] - 12s 962ms/step - loss: 0.1029 - acc: 0.9816\n",
      "46/46 [==============================] - 41s 886ms/step - loss: 0.1068 - acc: 0.9872 - val_loss: 0.1029 - val_acc: 0.9816\n",
      "Epoch 5/10\n",
      "12/12 [==============================] - 11s 921ms/step - loss: 0.1072 - acc: 0.9853\n",
      "46/46 [==============================] - 40s 862ms/step - loss: 0.1007 - acc: 0.9836 - val_loss: 0.1072 - val_acc: 0.9853\n",
      "Epoch 6/10\n",
      "12/12 [==============================] - 11s 934ms/step - loss: 0.0949 - acc: 0.9853\n",
      "46/46 [==============================] - 41s 883ms/step - loss: 0.1086 - acc: 0.9781 - val_loss: 0.0949 - val_acc: 0.9853\n",
      "Epoch 7/10\n",
      "12/12 [==============================] - 11s 930ms/step - loss: 0.0920 - acc: 0.9853\n",
      "46/46 [==============================] - 40s 869ms/step - loss: 0.1195 - acc: 0.9690 - val_loss: 0.0920 - val_acc: 0.9853\n",
      "Epoch 8/10\n",
      "12/12 [==============================] - 11s 935ms/step - loss: 0.0953 - acc: 0.9816\n",
      "46/46 [==============================] - 40s 880ms/step - loss: 0.0977 - acc: 0.9790 - val_loss: 0.0953 - val_acc: 0.9816\n",
      "Epoch 9/10\n",
      "12/12 [==============================] - 11s 931ms/step - loss: 0.0887 - acc: 0.9853\n",
      "46/46 [==============================] - 40s 869ms/step - loss: 0.0892 - acc: 0.9863 - val_loss: 0.0887 - val_acc: 0.9853\n",
      "Epoch 10/10\n",
      "12/12 [==============================] - 11s 921ms/step - loss: 0.0935 - acc: 0.9816\n",
      "46/46 [==============================] - 40s 877ms/step - loss: 0.1081 - acc: 0.9818 - val_loss: 0.0935 - val_acc: 0.9816\n"
     ]
    }
   ],
   "source": [
    "epochs = 10\n",
    "history = resnet50_fine_tune.fit_generator(train_generator,\n",
    "                                           steps_per_epoch = train_num // batch_size,\n",
    "                                           epochs = epochs,\n",
    "                                           validation_data = valid_generator,\n",
    "                                           validation_steps = valid_num // batch_size)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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rF27luef7/yA4xe+8AWWL1/Oo48+CsALL7wwl2XPiCEtSXrV/tX/eIzdTx8e6DYv/M1l/NE/vWjadl/5yle4/fbbAdi7dy/bt2/n7W9/+8SfPq1YsQKAu+++mx07dkysd+aZZw603mHydLck6bQzMjLC3XffzX333cePfvQjLr30Ut74xjfOdVkD50hakvSq9TPiHYZDhw5x5plnsnjxYn76059y//33U6/X2bVrF0899dTE6e4VK1bwrne9i23btvGlL30J6JzuPl1G046kJUmnnauuuopms8kb3vAGtm7dyhVXXMGqVavYvn0773vf+9iwYQObN28G4DOf+QwvvPACF198MRs2bGDnzp1zXH3/HElLkk471WqV733ve1M+dvXVV79sfsmSJXz9618/FWUNnCNpSZIyZUhLkpQpQ1qSpEwZ0pIkZcqQliQpU4a0JEmZMqQlScqUIS1JmveWLFky1yW8Koa0JEmZMqQlSaedrVu3sm3bton5z33uc3zxi19k06ZNXHbZZaxfv57vfve7fW1rdHT0hOvdcsstXHLJJWzYsIEPfvCDADz77LO8973vZcOGDWzYsIF77713sC+uh5cFlSS9et/bCs88OthtnrMerv7jkzbZvHkzH//4x/noRz8KwK233spdd93FTTfdxLJly/jVr37FFVdcwTXXXENEnHRbtVqN22+//RXr7d69my9+8Yvce++9rFy5cuL3qW+66SauvPJKbr/9dlqtFqOjo4N53VMwpCVJp51LL72U5557jqeffpoDBw5w5plncs455/CJT3yCXbt2USgU2L9/P88++yznnHPOSbeVUuJTn/rUK9a75557uO6661i5ciVw/Pep77nnHm655RYAisUiy5cvH9rrNKQlSa/eNCPeYbruuuu47bbbeOaZZ9i8eTPf/OY3OXDgAA8//DDlcpk1a9ZQr9en3c6rXe9U8DNpSdJpafPmzezYsYPbbruN6667jkOHDnH22WdTLpfZuXMnP//5z/vazonWe8c73sG3v/1tDh48CDBxunvTpk189atfBaDVanHo0KEhvLoOQ1qSdFq66KKLOHLkCOeddx7nnnsuH/jAB3jooYdYv349t9xyC69//ev72s6J1rvooov49Kc/zZVXXsmGDRv45Cc/CcCXv/xldu7cyfr167n88svZvXv30F6jp7slSaetRx89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\n",
      "text/plain": [
       "<Figure size 576x360 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAfAAAAEzCAYAAADO0FH8AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzt3X2UZXV97/n39zxVdQMiQitCIzQTVhulBQyijgoVMYB4FbNyHSDgbYmmZxkf78xigiYLHZKbB8m63pt1idArIWgGQYdrJtxrJ4QVqQtO1AFJI08CHQTpFgVpxS666+Gc850/zq7mVHV116muU121q9+vtfbae/9+v73Pr35dfT5777Nrn8hMJElSuVQWuwOSJGnuDHBJkkrIAJckqYQMcEmSSsgAlySphAxwSZJKaNYAj4jjIuKOiHgoIh6MiE/M0CYi4s8jYktEfC8iXt9Vtz4iHium9f3+ASRJOhjFbH8HHhGvBF6ZmfdGxGHAd4H3ZuZDXW3OBz4GnA+8EfjPmfnGiHgZcA9wOpDFtr+SmT9bkJ9GkqSDxKxn4Jn5dGbeWyzvAB4Gjp3W7ALgS9nxbeClRfCfC9yemduL0L4dOK+vP4EkSQehOX0GHhEnAKcB35lWdSzwVNf61qJsb+WSJGkear02jIhDgf8KfDIzf9HvjkTEBmADwODg4K+86lWv6vdLqEu73aZS8R7GheQYLzzH+MBwnBfeo48++tPMXDWXbXoK8Iio0wnvGzPzazM02QYc17W+uijbBgxNKx+e6TUycyOwEWDt2rX5yCOP9NI17afh4WGGhoYWuxvLmmO88BzjA8NxXngR8eRct+nlLvQA/gp4ODP/416a3Qr8u+Ju9DcBz2fm08BtwDkRcUREHAGcU5RJkqR56OUM/C3A+4H7I2JzUfZp4FUAmXktsInOHehbgJ3AZUXd9oj4A+DuYrurMnN7/7ovSdLBadYAz8xvAjFLmwQ+spe664Hr96t3kiRpRj3fxCZJ0t5MTEywdetWRkdHF7srS9rg4CCrV6+mXq/Pe18GuCRp3rZu3cphhx3GCSecQOfWKU2XmTz33HNs3bqVNWvWzHt//l2AJGneRkdHOfLIIw3vfYgIjjzyyL5dpTDAJUl9YXjPrp9jZIBLkpaFQw89dLG7cEAZ4JIklZABLklaVjKTyy+/nJNPPpl169bxla98BYCnn36aM888k1NPPZWTTz6Zu+66i1arxQc+8IHdbT//+c8vcu97513okqRl5Wtf+xqbN2/mvvvu46c//SlveMMbOPPMM/nyl7/Mueeey+/93u/RarXYuXMnmzdvZtu2bTzwwAMA/PznP1/k3vfOAJck9dX/+d8e5KEf9fc7r15zzEv4zLtf21Pbb37zm1x88cVUq1Ve8YpXcNZZZ3H33Xfzhje8gd/6rd9iYmKC9773vZx66qmceOKJPP7443zsYx/jXe96F+ecc05f+72QvIQuSToonHnmmdx5550ce+yxfOADH+BLX/oSRxxxBPfddx9DQ0Nce+21fOhDH1rsbvbMM3BJUl/1eqa8UN72trdx3XXXsX79erZv386dd97J1VdfzZNPPsnq1av57d/+bcbGxrj33ns5//zzaTQa/MZv/AZr167l0ksvXdS+z4UBLklaVn7913+db33rW5xyyilEBJ/73Oc4+uij+eIXv8jVV19NvV7n0EMP5Utf+hLbtm3jsssuo91uA/DHf/zHi9z73hngkqRlYWRkBOg8LOXqq6/m6quvnlK/fv161q9fv8d299577wHpX7/5GbgkSSVkgEuSVEIGuCRJJWSAS5JUQga4JEklZIBLklRCBrgkSSVkgEuSDjr7+u7wJ554gpNPPvkA9mb/GOCSJJWQAS5JKr0rrriCa665Zvf6Zz/7Wf7wD/+Qs88+m9e//vWsW7eOv/u7v5vzfkdHR7nssstYt24dp512GnfccQcADz74IGeccQannnoqr3vd63jsscd44YUXeNe73sUpp5zCySefvPt7yBeKj1KVJPXX318BP76/v/s8eh2880/2Wn3hhRfyyU9+ko985CMAfPWrX+W2227j4x//OC95yUv46U9/ypve9Cbe8573EBE9v+w111xDRHD//ffz/e9/n3POOYdHH32Ua6+9lk984hNccskljI+P02q12LRpE8cccwxf//rXAXj++efn9zPPwjNwSVLpnXbaaTzzzDP86Ec/4r777uOII47g6KOP5tOf/jSve93reMc73sG2bdv4yU9+Mqf9fvOb39z9DWWvfvWrOf7443n00Ud585vfzB/90R/xp3/6pzz55JOsWLGCdevWcfvtt/O7v/u73HXXXRx++OEL8aPuNusZeERcD/wb4JnM3ONT/Yi4HLik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\n",
      "text/plain": [
       "<Figure size 576x360 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def plot_learning_curves(history, label, epcohs, min_value, max_value):\n",
    "    data = {}\n",
    "    data[label] = history.history[label]\n",
    "    data['val_'+label] = history.history['val_'+label]\n",
    "    pd.DataFrame(data).plot(figsize=(8, 5))\n",
    "    plt.grid(True)\n",
    "    plt.axis([0, epochs, min_value, max_value])\n",
    "    plt.show()\n",
    "    \n",
    "# 训练效果很好\n",
    "plot_learning_curves(history, 'acc', epochs, 0, 1)\n",
    "plot_learning_curves(history, 'loss', epochs, 0, 2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "__________________________________________________________________________________________________\n",
      "Layer (type)                    Output Shape         Param #     Connected to                     \n",
      "==================================================================================================\n",
      "input_2 (InputLayer)            (None, None, None, 3 0                                            \n",
      "__________________________________________________________________________________________________\n",
      "conv1_pad (ZeroPadding2D)       (None, None, None, 3 0           input_2[0][0]                    \n",
      "__________________________________________________________________________________________________\n",
      "conv1 (Conv2D)                  (None, None, None, 6 9472        conv1_pad[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "bn_conv1 (BatchNormalizationV1) (None, None, None, 6 256         conv1[0][0]                      \n",
      "__________________________________________________________________________________________________\n",
      "activation_49 (Activation)      (None, None, None, 6 0           bn_conv1[0][0]                   \n",
      "__________________________________________________________________________________________________\n",
      "pool1_pad (ZeroPadding2D)       (None, None, None, 6 0           activation_49[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "max_pooling2d_1 (MaxPooling2D)  (None, None, None, 6 0           pool1_pad[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "res2a_branch2a (Conv2D)         (None, None, None, 6 4160        max_pooling2d_1[0][0]            \n",
      "__________________________________________________________________________________________________\n",
      "bn2a_branch2a (BatchNormalizati (None, None, None, 6 256         res2a_branch2a[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_50 (Activation)      (None, None, None, 6 0           bn2a_branch2a[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res2a_branch2b (Conv2D)         (None, None, None, 6 36928       activation_50[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "bn2a_branch2b (BatchNormalizati (None, None, None, 6 256         res2a_branch2b[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_51 (Activation)      (None, None, None, 6 0           bn2a_branch2b[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res2a_branch2c (Conv2D)         (None, None, None, 2 16640       activation_51[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res2a_branch1 (Conv2D)          (None, None, None, 2 16640       max_pooling2d_1[0][0]            \n",
      "__________________________________________________________________________________________________\n",
      "bn2a_branch2c (BatchNormalizati (None, None, None, 2 1024        res2a_branch2c[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "bn2a_branch1 (BatchNormalizatio (None, None, None, 2 1024        res2a_branch1[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "add_16 (Add)                    (None, None, None, 2 0           bn2a_branch2c[0][0]              \n",
      "                                                                 bn2a_branch1[0][0]               \n",
      "__________________________________________________________________________________________________\n",
      "activation_52 (Activation)      (None, None, None, 2 0           add_16[0][0]                     \n",
      "__________________________________________________________________________________________________\n",
      "res2b_branch2a (Conv2D)         (None, None, None, 6 16448       activation_52[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "bn2b_branch2a (BatchNormalizati (None, None, None, 6 256         res2b_branch2a[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_53 (Activation)      (None, None, None, 6 0           bn2b_branch2a[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res2b_branch2b (Conv2D)         (None, None, None, 6 36928       activation_53[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "bn2b_branch2b (BatchNormalizati (None, None, None, 6 256         res2b_branch2b[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_54 (Activation)      (None, None, None, 6 0           bn2b_branch2b[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res2b_branch2c (Conv2D)         (None, None, None, 2 16640       activation_54[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "bn2b_branch2c (BatchNormalizati (None, None, None, 2 1024        res2b_branch2c[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "add_17 (Add)                    (None, None, None, 2 0           bn2b_branch2c[0][0]              \n",
      "                                                                 activation_52[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "activation_55 (Activation)      (None, None, None, 2 0           add_17[0][0]                     \n",
      "__________________________________________________________________________________________________\n",
      "res2c_branch2a (Conv2D)         (None, None, None, 6 16448       activation_55[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "bn2c_branch2a (BatchNormalizati (None, None, None, 6 256         res2c_branch2a[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_56 (Activation)      (None, None, None, 6 0           bn2c_branch2a[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res2c_branch2b (Conv2D)         (None, None, None, 6 36928       activation_56[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "bn2c_branch2b (BatchNormalizati (None, None, None, 6 256         res2c_branch2b[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_57 (Activation)      (None, None, None, 6 0           bn2c_branch2b[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res2c_branch2c (Conv2D)         (None, None, None, 2 16640       activation_57[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "bn2c_branch2c (BatchNormalizati (None, None, None, 2 1024        res2c_branch2c[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "add_18 (Add)                    (None, None, None, 2 0           bn2c_branch2c[0][0]              \n",
      "                                                                 activation_55[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "activation_58 (Activation)      (None, None, None, 2 0           add_18[0][0]                     \n",
      "__________________________________________________________________________________________________\n",
      "res3a_branch2a (Conv2D)         (None, None, None, 1 32896       activation_58[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "bn3a_branch2a (BatchNormalizati (None, None, None, 1 512         res3a_branch2a[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_59 (Activation)      (None, None, None, 1 0           bn3a_branch2a[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res3a_branch2b (Conv2D)         (None, None, None, 1 147584      activation_59[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "bn3a_branch2b (BatchNormalizati (None, None, None, 1 512         res3a_branch2b[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_60 (Activation)      (None, None, None, 1 0           bn3a_branch2b[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res3a_branch2c (Conv2D)         (None, None, None, 5 66048       activation_60[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res3a_branch1 (Conv2D)          (None, None, None, 5 131584      activation_58[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "bn3a_branch2c (BatchNormalizati (None, None, None, 5 2048        res3a_branch2c[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "bn3a_branch1 (BatchNormalizatio (None, None, None, 5 2048        res3a_branch1[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "add_19 (Add)                    (None, None, None, 5 0           bn3a_branch2c[0][0]              \n",
      "                                                                 bn3a_branch1[0][0]               \n",
      "__________________________________________________________________________________________________\n",
      "activation_61 (Activation)      (None, None, None, 5 0           add_19[0][0]                     \n",
      "__________________________________________________________________________________________________\n",
      "res3b_branch2a (Conv2D)         (None, None, None, 1 65664       activation_61[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "bn3b_branch2a (BatchNormalizati (None, None, None, 1 512         res3b_branch2a[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_62 (Activation)      (None, None, None, 1 0           bn3b_branch2a[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res3b_branch2b (Conv2D)         (None, None, None, 1 147584      activation_62[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "bn3b_branch2b (BatchNormalizati (None, None, None, 1 512         res3b_branch2b[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_63 (Activation)      (None, None, None, 1 0           bn3b_branch2b[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res3b_branch2c (Conv2D)         (None, None, None, 5 66048       activation_63[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "bn3b_branch2c (BatchNormalizati (None, None, None, 5 2048        res3b_branch2c[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "add_20 (Add)                    (None, None, None, 5 0           bn3b_branch2c[0][0]              \n",
      "                                                                 activation_61[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "activation_64 (Activation)      (None, None, None, 5 0           add_20[0][0]                     \n",
      "__________________________________________________________________________________________________\n",
      "res3c_branch2a (Conv2D)         (None, None, None, 1 65664       activation_64[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "bn3c_branch2a (BatchNormalizati (None, None, None, 1 512         res3c_branch2a[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_65 (Activation)      (None, None, None, 1 0           bn3c_branch2a[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res3c_branch2b (Conv2D)         (None, None, None, 1 147584      activation_65[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "bn3c_branch2b (BatchNormalizati (None, None, None, 1 512         res3c_branch2b[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_66 (Activation)      (None, None, None, 1 0           bn3c_branch2b[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res3c_branch2c (Conv2D)         (None, None, None, 5 66048       activation_66[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "bn3c_branch2c (BatchNormalizati (None, None, None, 5 2048        res3c_branch2c[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "add_21 (Add)                    (None, None, None, 5 0           bn3c_branch2c[0][0]              \n",
      "                                                                 activation_64[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "activation_67 (Activation)      (None, None, None, 5 0           add_21[0][0]                     \n",
      "__________________________________________________________________________________________________\n",
      "res3d_branch2a (Conv2D)         (None, None, None, 1 65664       activation_67[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "bn3d_branch2a (BatchNormalizati (None, None, None, 1 512         res3d_branch2a[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_68 (Activation)      (None, None, None, 1 0           bn3d_branch2a[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res3d_branch2b (Conv2D)         (None, None, None, 1 147584      activation_68[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "bn3d_branch2b (BatchNormalizati (None, None, None, 1 512         res3d_branch2b[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_69 (Activation)      (None, None, None, 1 0           bn3d_branch2b[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res3d_branch2c (Conv2D)         (None, None, None, 5 66048       activation_69[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "bn3d_branch2c (BatchNormalizati (None, None, None, 5 2048        res3d_branch2c[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "add_22 (Add)                    (None, None, None, 5 0           bn3d_branch2c[0][0]              \n",
      "                                                                 activation_67[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "activation_70 (Activation)      (None, None, None, 5 0           add_22[0][0]                     \n",
      "__________________________________________________________________________________________________\n",
      "res4a_branch2a (Conv2D)         (None, None, None, 2 131328      activation_70[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "bn4a_branch2a (BatchNormalizati (None, None, None, 2 1024        res4a_branch2a[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_71 (Activation)      (None, None, None, 2 0           bn4a_branch2a[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res4a_branch2b (Conv2D)         (None, None, None, 2 590080      activation_71[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "bn4a_branch2b (BatchNormalizati (None, None, None, 2 1024        res4a_branch2b[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_72 (Activation)      (None, None, None, 2 0           bn4a_branch2b[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res4a_branch2c (Conv2D)         (None, None, None, 1 263168      activation_72[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res4a_branch1 (Conv2D)          (None, None, None, 1 525312      activation_70[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "bn4a_branch2c (BatchNormalizati (None, None, None, 1 4096        res4a_branch2c[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "bn4a_branch1 (BatchNormalizatio (None, None, None, 1 4096        res4a_branch1[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "add_23 (Add)                    (None, None, None, 1 0           bn4a_branch2c[0][0]              \n",
      "                                                                 bn4a_branch1[0][0]               \n",
      "__________________________________________________________________________________________________\n",
      "activation_73 (Activation)      (None, None, None, 1 0           add_23[0][0]                     \n",
      "__________________________________________________________________________________________________\n",
      "res4b_branch2a (Conv2D)         (None, None, None, 2 262400      activation_73[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "bn4b_branch2a (BatchNormalizati (None, None, None, 2 1024        res4b_branch2a[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_74 (Activation)      (None, None, None, 2 0           bn4b_branch2a[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res4b_branch2b (Conv2D)         (None, None, None, 2 590080      activation_74[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "bn4b_branch2b (BatchNormalizati (None, None, None, 2 1024        res4b_branch2b[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_75 (Activation)      (None, None, None, 2 0           bn4b_branch2b[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res4b_branch2c (Conv2D)         (None, None, None, 1 263168      activation_75[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "bn4b_branch2c (BatchNormalizati (None, None, None, 1 4096        res4b_branch2c[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "add_24 (Add)                    (None, None, None, 1 0           bn4b_branch2c[0][0]              \n",
      "                                                                 activation_73[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "activation_76 (Activation)      (None, None, None, 1 0           add_24[0][0]                     \n",
      "__________________________________________________________________________________________________\n",
      "res4c_branch2a (Conv2D)         (None, None, None, 2 262400      activation_76[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "bn4c_branch2a (BatchNormalizati (None, None, None, 2 1024        res4c_branch2a[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_77 (Activation)      (None, None, None, 2 0           bn4c_branch2a[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res4c_branch2b (Conv2D)         (None, None, None, 2 590080      activation_77[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "bn4c_branch2b (BatchNormalizati (None, None, None, 2 1024        res4c_branch2b[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_78 (Activation)      (None, None, None, 2 0           bn4c_branch2b[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res4c_branch2c (Conv2D)         (None, None, None, 1 263168      activation_78[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "bn4c_branch2c (BatchNormalizati (None, None, None, 1 4096        res4c_branch2c[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "add_25 (Add)                    (None, None, None, 1 0           bn4c_branch2c[0][0]              \n",
      "                                                                 activation_76[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "activation_79 (Activation)      (None, None, None, 1 0           add_25[0][0]                     \n",
      "__________________________________________________________________________________________________\n",
      "res4d_branch2a (Conv2D)         (None, None, None, 2 262400      activation_79[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "bn4d_branch2a (BatchNormalizati (None, None, None, 2 1024        res4d_branch2a[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_80 (Activation)      (None, None, None, 2 0           bn4d_branch2a[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res4d_branch2b (Conv2D)         (None, None, None, 2 590080      activation_80[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "bn4d_branch2b (BatchNormalizati (None, None, None, 2 1024        res4d_branch2b[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_81 (Activation)      (None, None, None, 2 0           bn4d_branch2b[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res4d_branch2c (Conv2D)         (None, None, None, 1 263168      activation_81[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "bn4d_branch2c (BatchNormalizati (None, None, None, 1 4096        res4d_branch2c[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "add_26 (Add)                    (None, None, None, 1 0           bn4d_branch2c[0][0]              \n",
      "                                                                 activation_79[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "activation_82 (Activation)      (None, None, None, 1 0           add_26[0][0]                     \n",
      "__________________________________________________________________________________________________\n",
      "res4e_branch2a (Conv2D)         (None, None, None, 2 262400      activation_82[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "bn4e_branch2a (BatchNormalizati (None, None, None, 2 1024        res4e_branch2a[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_83 (Activation)      (None, None, None, 2 0           bn4e_branch2a[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res4e_branch2b (Conv2D)         (None, None, None, 2 590080      activation_83[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "bn4e_branch2b (BatchNormalizati (None, None, None, 2 1024        res4e_branch2b[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_84 (Activation)      (None, None, None, 2 0           bn4e_branch2b[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res4e_branch2c (Conv2D)         (None, None, None, 1 263168      activation_84[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "bn4e_branch2c (BatchNormalizati (None, None, None, 1 4096        res4e_branch2c[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "add_27 (Add)                    (None, None, None, 1 0           bn4e_branch2c[0][0]              \n",
      "                                                                 activation_82[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "activation_85 (Activation)      (None, None, None, 1 0           add_27[0][0]                     \n",
      "__________________________________________________________________________________________________\n",
      "res4f_branch2a (Conv2D)         (None, None, None, 2 262400      activation_85[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "bn4f_branch2a (BatchNormalizati (None, None, None, 2 1024        res4f_branch2a[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_86 (Activation)      (None, None, None, 2 0           bn4f_branch2a[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res4f_branch2b (Conv2D)         (None, None, None, 2 590080      activation_86[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "bn4f_branch2b (BatchNormalizati (None, None, None, 2 1024        res4f_branch2b[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_87 (Activation)      (None, None, None, 2 0           bn4f_branch2b[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res4f_branch2c (Conv2D)         (None, None, None, 1 263168      activation_87[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "bn4f_branch2c (BatchNormalizati (None, None, None, 1 4096        res4f_branch2c[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "add_28 (Add)                    (None, None, None, 1 0           bn4f_branch2c[0][0]              \n",
      "                                                                 activation_85[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "activation_88 (Activation)      (None, None, None, 1 0           add_28[0][0]                     \n",
      "__________________________________________________________________________________________________\n",
      "res5a_branch2a (Conv2D)         (None, None, None, 5 524800      activation_88[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "bn5a_branch2a (BatchNormalizati (None, None, None, 5 2048        res5a_branch2a[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_89 (Activation)      (None, None, None, 5 0           bn5a_branch2a[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res5a_branch2b (Conv2D)         (None, None, None, 5 2359808     activation_89[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "bn5a_branch2b (BatchNormalizati (None, None, None, 5 2048        res5a_branch2b[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_90 (Activation)      (None, None, None, 5 0           bn5a_branch2b[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res5a_branch2c (Conv2D)         (None, None, None, 2 1050624     activation_90[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res5a_branch1 (Conv2D)          (None, None, None, 2 2099200     activation_88[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "bn5a_branch2c (BatchNormalizati (None, None, None, 2 8192        res5a_branch2c[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "bn5a_branch1 (BatchNormalizatio (None, None, None, 2 8192        res5a_branch1[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "add_29 (Add)                    (None, None, None, 2 0           bn5a_branch2c[0][0]              \n",
      "                                                                 bn5a_branch1[0][0]               \n",
      "__________________________________________________________________________________________________\n",
      "activation_91 (Activation)      (None, None, None, 2 0           add_29[0][0]                     \n",
      "__________________________________________________________________________________________________\n",
      "res5b_branch2a (Conv2D)         (None, None, None, 5 1049088     activation_91[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "bn5b_branch2a (BatchNormalizati (None, None, None, 5 2048        res5b_branch2a[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_92 (Activation)      (None, None, None, 5 0           bn5b_branch2a[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res5b_branch2b (Conv2D)         (None, None, None, 5 2359808     activation_92[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "bn5b_branch2b (BatchNormalizati (None, None, None, 5 2048        res5b_branch2b[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_93 (Activation)      (None, None, None, 5 0           bn5b_branch2b[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res5b_branch2c (Conv2D)         (None, None, None, 2 1050624     activation_93[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "bn5b_branch2c (BatchNormalizati (None, None, None, 2 8192        res5b_branch2c[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "add_30 (Add)                    (None, None, None, 2 0           bn5b_branch2c[0][0]              \n",
      "                                                                 activation_91[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "activation_94 (Activation)      (None, None, None, 2 0           add_30[0][0]                     \n",
      "__________________________________________________________________________________________________\n",
      "res5c_branch2a (Conv2D)         (None, None, None, 5 1049088     activation_94[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "bn5c_branch2a (BatchNormalizati (None, None, None, 5 2048        res5c_branch2a[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_95 (Activation)      (None, None, None, 5 0           bn5c_branch2a[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res5c_branch2b (Conv2D)         (None, None, None, 5 2359808     activation_95[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "bn5c_branch2b (BatchNormalizati (None, None, None, 5 2048        res5c_branch2b[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "activation_96 (Activation)      (None, None, None, 5 0           bn5c_branch2b[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "res5c_branch2c (Conv2D)         (None, None, None, 2 1050624     activation_96[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "bn5c_branch2c (BatchNormalizati (None, None, None, 2 8192        res5c_branch2c[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "add_31 (Add)                    (None, None, None, 2 0           bn5c_branch2c[0][0]              \n",
      "                                                                 activation_94[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "activation_97 (Activation)      (None, None, None, 2 0           add_31[0][0]                     \n",
      "__________________________________________________________________________________________________\n",
      "global_average_pooling2d_1 (Glo (None, 2048)         0           activation_97[0][0]              \n",
      "==================================================================================================\n",
      "Total params: 23,587,712\n",
      "Trainable params: 23,534,592\n",
      "Non-trainable params: 53,120\n",
      "__________________________________________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "## 直接创建该ResNet50模型看看\n",
    "resnet50 = keras.applications.ResNet50(include_top = False,\n",
    "                                       pooling = 'avg',\n",
    "                                       weights = 'imagenet')\n",
    "resnet50.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "resnet50 (Model)             (None, 2048)              23587712  \n",
      "_________________________________________________________________\n",
      "dense_1 (Dense)              (None, 10)                20490     \n",
      "=================================================================\n",
      "Total params: 23,608,202\n",
      "Trainable params: 1,075,210\n",
      "Non-trainable params: 22,532,992\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "## 为了实现fine-tuning,，我们需要让resnet50 模型的最后几层能够被训练，\n",
    "for layer in resnet50.layers[0:-5]:\n",
    "    layer.trainable = False\n",
    "\n",
    "resnet50_new = keras.models.Sequential([\n",
    "    resnet50,\n",
    "    keras.layers.Dense(num_classes, activation = 'softmax'),\n",
    "])\n",
    "resnet50_new.compile(loss=\"categorical_crossentropy\",\n",
    "                     optimizer=\"sgd\", metrics=['accuracy'])\n",
    "\n",
    "## 可以发现 trainable的数据变多了 \n",
    "resnet50_new.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/10\n",
      "12/12 [==============================] - 12s 976ms/step - loss: 0.5398 - acc: 0.8640\n",
      "46/46 [==============================] - 46s 989ms/step - loss: 1.3628 - acc: 0.6153 - val_loss: 0.5398 - val_acc: 0.8640\n",
      "Epoch 2/10\n",
      "12/12 [==============================] - 11s 921ms/step - loss: 0.2413 - acc: 0.9485\n",
      "46/46 [==============================] - 40s 866ms/step - loss: 0.5323 - acc: 0.9006 - val_loss: 0.2413 - val_acc: 0.9485\n",
      "Epoch 3/10\n",
      "12/12 [==============================] - 11s 918ms/step - loss: 0.1910 - acc: 0.9559\n",
      "46/46 [==============================] - 40s 878ms/step - loss: 0.3375 - acc: 0.9508 - val_loss: 0.1910 - val_acc: 0.9559\n",
      "Epoch 4/10\n",
      "12/12 [==============================] - 11s 912ms/step - loss: 0.1562 - acc: 0.9596\n",
      "46/46 [==============================] - 40s 878ms/step - loss: 0.2672 - acc: 0.9535 - val_loss: 0.1562 - val_acc: 0.9596\n",
      "Epoch 5/10\n",
      "12/12 [==============================] - 11s 919ms/step - loss: 0.1544 - acc: 0.9449\n",
      "46/46 [==============================] - 40s 871ms/step - loss: 0.2336 - acc: 0.9544 - val_loss: 0.1544 - val_acc: 0.9449\n",
      "Epoch 6/10\n",
      "12/12 [==============================] - 11s 917ms/step - loss: 0.1322 - acc: 0.9596\n",
      "46/46 [==============================] - 40s 869ms/step - loss: 0.1926 - acc: 0.9717 - val_loss: 0.1322 - val_acc: 0.9596\n",
      "Epoch 7/10\n",
      "12/12 [==============================] - 11s 912ms/step - loss: 0.1235 - acc: 0.9559\n",
      "46/46 [==============================] - 40s 866ms/step - loss: 0.1700 - acc: 0.9708 - val_loss: 0.1235 - val_acc: 0.9559\n",
      "Epoch 8/10\n",
      "12/12 [==============================] - 11s 926ms/step - loss: 0.1078 - acc: 0.9669\n",
      "46/46 [==============================] - 40s 869ms/step - loss: 0.1585 - acc: 0.9708 - val_loss: 0.1078 - val_acc: 0.9669\n",
      "Epoch 9/10\n",
      "12/12 [==============================] - 11s 921ms/step - loss: 0.1215 - acc: 0.9596\n",
      "46/46 [==============================] - 41s 883ms/step - loss: 0.1428 - acc: 0.9736 - val_loss: 0.1215 - val_acc: 0.9596\n",
      "Epoch 10/10\n",
      "12/12 [==============================] - 11s 924ms/step - loss: 0.1246 - acc: 0.9559\n",
      "46/46 [==============================] - 40s 869ms/step - loss: 0.1372 - acc: 0.9763 - val_loss: 0.1246 - val_acc: 0.9559\n"
     ]
    }
   ],
   "source": [
    "epochs = 10\n",
    "## 因为resnet 后几层 可训练的模型参数  与 最后一层Dense我们自己初始化的模型参数差距比较大\n",
    "## 并且学习率比较大，需要更多epoch的训练\n",
    "## 因此，再10次的训练过程中，模型表现还没有 没有fine-tuning 的模型表现好\n",
    "history = resnet50_new.fit_generator(train_generator,\n",
    "                                     steps_per_epoch = train_num // batch_size,\n",
    "                                     epochs = epochs,\n",
    "                                     validation_data = valid_generator,\n",
    "                                     validation_steps = valid_num // batch_size)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x360 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAfAAAAEzCAYAAADO0FH8AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzt3Xl8VPW9//HXZ2ayJyQhhC0Jm2IQQUABtVaJSxH1Km2tCi61tr3ctlq7Xe+17f1pr7f3drG367VVrqXW1rLUYrWVulw1LnUDEQRUFlEgYV8SSELW+f7+OEOYhIRMyCSz5P18POYxM9+zzCffWt5zznzP95hzDhEREUksvlgXICIiIt2nABcREUlACnAREZEEpAAXERFJQApwERGRBKQAFxERSUBdBriZlZjZ82b2jpmtM7OvdLCOmdnPzWyTmb1tZmeELbvJzDaGHjdF+w8QERHpj6yr68DNbBgwzDm30sxygDeBjzvn3glb5zLgy8BlwFnAz5xzZ5nZQGAFMBVwoW3PdM4d6JW/RkREpJ/o8gjcObfDObcy9PoQ8C5Q1G612cBDzvMakBcK/kuAZ5xz+0Oh/QwwK6p/gYiISD/Urd/AzWwUMAV4vd2iImBb2PuKUFtn7SIiItIDgUhXNLNs4E/AV51zB6NdiJnNA+YBpKennzlixIhof4SECQaD+Hwaw9ib1Me9T33cN9TPvW/Dhg17nXOF3dkmogA3sxS88H7YObe0g1UqgZKw98WhtkqgrF17eUef4ZybD8wHKC0tdevXr4+kNDlB5eXllJWVxbqMpKY+7n3q476hfu59Zralu9tEMgrdgF8D7zrnftzJao8Dnw6NRj8bqHbO7QCeAmaaWb6Z5QMzQ20iIiLSA5EcgZ8L3AisMbNVobZvASMAnHP3AcvwRqBvAuqAm0PL9pvZfwDLQ9vd7ZzbH73yRURE+qcuA9w59zJgXazjgFs6WbYAWHBC1YmIiEiHIh7EJiIi0pmmpiYqKiqor6+PdSlxLT09neLiYlJSUnq8LwW4iIj0WEVFBTk5OYwaNQpv6JS055xj3759VFRUMHr06B7vT9cFiIhIj9XX11NQUKDwPg4zo6CgIGpnKRTgIiISFQrvrkWzjxTgIiKSFLKzs2NdQp9SgIuIiCQgBbiIiCQV5xy33347EyZMYOLEiSxevBiAHTt2cP755zN58mQmTJjASy+9REtLC5/5zGda1/3JT34S4+ojp1HoIiKSVJYuXcqqVatYvXo1e/fuZdq0aZx//vn84Q9/4JJLLuHb3/42LS0t1NXVsWrVKiorK1m7di0AVVVVMa4+cgpwERGJqn//yzre2R7de16NHz6Au644LaJ1X375ZebOnYvf72fIkCHMmDGD5cuXM23aND772c/S1NTExz/+cSZPnsyYMWPYvHkzX/7yl7n88suZOXNmVOvuTTqFLiIi/cL555/Piy++SFFREZ/5zGd46KGHyM/PZ/Xq1ZSVlXHffffx+c9/PtZlRkxH4CIiElWRHin3lvPOO4/777+fm266if379/Piiy9yzz33sGXLFoqLi/nHf/xHGhoaWLlyJZdddhmpqalcddVVlJaWcsMNN8S09u5QgIuISFL5xCc+wauvvsqkSZMwM374wx8ydOhQfvvb33LPPfeQkpJCdnY2Dz30EJWVldx8880Eg0EAvve978W4+sgpwEVEJCnU1NQA3mQp99xzD/fcc0+b5TfddBM33XTTMdutXLmyT+qLNv0GLiIikoAU4CIiIglIAS4iIpKAFOAiIiIJSAEuIiKSgBTgIiIiCUgBLiIikoAU4CIi0u8c797hH374IRMmTOjDak6MAlxERCQBKcBFRCTh3XHHHdx7772t77/zne/w3e9+l4suuogzzjiDiRMn8thjj3V7v/X19dx8881MnDiRKVOm8PzzzwOwbt06pk+fzuTJkzn99NPZuHEjtbW1XH755UyaNIkJEya03oe8t2gqVRERia6/3QE710R3n0MnwqXf73Txtddey1e/+lVuueUWAJYsWcJTTz3FbbfdxoABA9i7dy9nn302V155JWYW8cfee++9mBlr1qzhvffeY+bMmWzYsIH77ruPr3zlK1x//fU0NjbS0tLCsmXLGD58OE888QQA1dXVPfubu6AjcBERSXhTpkxh9+7dbN++ndWrV5Ofn8/QoUP51re+xemnn87FF19MZWUlu3bt6tZ+X3755dY7lI0bN46RI0eyYcMGzjnnHP7rv/6LH/zgB2zZsoWMjAwmTpzIM888w7/+67/y0ksvkZub2xt/aqsuj8DNbAHwD8Bu59wxv+qb2e3A9WH7OxUodM7tN7MPgUNAC9DsnJsarcJFRCROHedIuTddffXVPPLII+zc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\n",
      "text/plain": [
       "<Figure size 576x360 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_learning_curves(history, 'acc', epochs, 0, 1)\n",
    "plot_learning_curves(history, 'loss', epochs, 0, 2)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
